package system

import (
	"github.com/flipped-aurora/gin-vue-admin/server/global"
	"github.com/flipped-aurora/gin-vue-admin/server/model/common"
	"github.com/google/uuid"
)

type Login interface {
	GetUsername() string
	GetNickname() string
	GetUUID() uuid.UUID
	GetUserId() uint
	GetAuthorityId() uint
	GetUserInfo() any
	GetMajor() int // 添加获取专业ID方法
}

var _ Login = new(SysUser)

type SysUser struct {
	global.GVA_MODEL
	UUID          uuid.UUID      `json:"uuid" gorm:"index;comment:用户UUID"`                                                     // 用户UUID
	Username      string         `json:"userName" gorm:"index;comment:用户登录名"`                                                  // 用户登录名
	Password      string         `json:"-"  gorm:"comment:用户登录密码"`                                                             // 用户登录密码
	NickName      string         `json:"nickName" gorm:"default:系统用户;comment:用户昵称"`                                            // 用户昵称
	HeaderImg     string         `json:"headerImg" gorm:"default:https://qmplusimg.henrongyi.top/gva_header.jpg;comment:用户头像"` // 用户头像
	AuthorityId   uint           `json:"authorityId" gorm:"default:888;comment:用户角色ID"`                                        // 用户角色ID
	Authority     SysAuthority   `json:"authority" gorm:"foreignKey:AuthorityId;references:AuthorityId;comment:用户角色"`          // 用户角色
	Authorities   []SysAuthority `json:"authorities" gorm:"many2many:sys_user_authority;"`                                     // 多用户角色
	Phone         string         `json:"phone"  gorm:"size:20;uniqueIndex;comment:用户手机号"`
	Openid        *string        `json:"openid" gorm:"size:64;uniqueIndex;comment:微信openid"`                                                 // 用户手机号
	Email         string         `json:"email"  gorm:"comment:用户邮箱"`                                                                         // 用户邮箱
	Enable        int            `json:"enable" gorm:"default:1;comment:用户是否被冻结 1正常 2冻结"`                                                    //用户是否被冻结 1正常 2冻结
	OriginSetting common.JSONMap `json:"originSetting" form:"originSetting" gorm:"type:text;default:null;column:origin_setting;comment:配置;"` //配置
	Gender        int            `json:"gender" gorm:"comment:性别"`                                                                           // 性别，使用字段配置中的值
	Age           int            `json:"age" gorm:"comment:年龄"`                                                                              // 年龄
	Grade         int            `json:"grade" gorm:"comment:年级"`                                                                            //年级，使用字典配置中的值
	School        int            `json:"school" gorm:"comment:学校"`                                                                           //学校，使用字典配置中的值
	Major         int            `json:"major" gorm:"comment:专业"`                                                                            //专业，使用字典配置中的值
	AuthStatus    int8           `json:"auth_status"  gorm:"comment:专业认证状态"`                                                                 // 专业认证标识
	Education     int            `json:"education" gorm:"comment:学历"`                                                                        //学历，使用字典配置中的值
	Signature     string         `json:"signature" gorm:"comment:个性签名"`                                                                      //个性签名

	ActiveTime    string `json:"activeTime" gorm:"comment:上次活跃时间"` //上次活跃时间
	FollowCount   int    `json:"followCount" gorm:"comment:关注数"`   //关注数
	FollowerCount int    `json:"followerCount" gorm:"comment:粉丝数"` //粉丝数
	ArticleCount  int    `json:"articleCount" gorm:"comment:文章数"`  //文章数
}

func (SysUser) TableName() string {
	return "sys_users"
}

func (s *SysUser) GetUsername() string {
	return s.Username
}

func (s *SysUser) GetNickname() string {
	return s.NickName
}

func (s *SysUser) GetUUID() uuid.UUID {
	return s.UUID
}

func (s *SysUser) GetUserId() uint {
	return s.ID
}

func (s *SysUser) GetAuthorityId() uint {
	return s.AuthorityId
}

func (s *SysUser) GetUserInfo() any {
	return *s
}

// 实现GetMajor方法
func (s *SysUser) GetMajor() int {
	return s.Major
}
